var http = require('http')
var fs = require('fs')
var url = require('url')
var port = process.argv[2]

if (!port) {
    console.log('请指定端口号好不啦？\nnode server.js 8888 这样不会吗？')
    process.exit(1)
}

var server = http.createServer(function (request, response) {
    var parsedUrl = url.parse(request.url, true)
    var pathWithQuery = request.url
    var queryString = ''
    if (pathWithQuery.indexOf('?') >= 0) {
        queryString = pathWithQuery.substring(pathWithQuery.indexOf('?'))
    }
    var path = parsedUrl.pathname
    var query = parsedUrl.query
    var method = request.method

    /******** 从这里开始看，上面不要看 ************/
    const session = JSON.parse(fs.readFileSync('./session.json').toString())
    console.log('有个傻子发请求过来啦！路径（带查询参数）为：' + pathWithQuery)
    if (path === '/home.html') {
        const cookie = request.headers["cookie"];
        let sessionId;
        try {
            sessionId = cookie
                .split(";")
                .filter(s => s.indexOf("session_id=") >= 0)[0]
                .split("=")[1];
        } catch (error) {}
        if (sessionId && session[sessionId]) {
            const userId = session[sessionId].user_id
            const homeHtml = fs.readFileSync("./public/home.html").toString();
            const userArray = JSON.parse(fs.readFileSync("./db/users.json"));
            const user = userArray.find(user => user.id === userId);
            let string = ''
            if (user) {
                string = homeHtml.replace("{{loginStatus}}", "已登录")
                    .replace('{{user.name}}', user.name)
            }
            response.write(string);
        } else {
            const homeHtml = fs.readFileSync("./public/home.html").toString();
            const string = homeHtml.replace("{{loginStatus}}", "未登录")
                .replace('{{user.name}}', '')
            response.write(string);
        }
        response.end()
    } else if (path === '/signin' && method === 'POST') {
        response.setHeader('Content-Type', `text/html;charset=utf-8`);
        const userArray = JSON.parse(fs.readFileSync('./db/users.json'))
        const array = [];
        // 监听上传事件,push数据进数组
        request.on('data', (chunk) => {
            array.push(chunk)
        })
        // 结束后查看数组
        request.on('end', () => {
            //Buffer将数据合成为字符串的功能
            const string = Buffer.concat(array).toString()
            const obj = JSON.parse(string)
            const user = userArray.find(user => user.name === obj.name && user.password === obj.password);
            if (user === undefined) {
                response.statusCode = 400;
                response.setHeader("Content-Type", "text/json; charset=utf-8");
            } else {
                response.statusCode = 200;
                // HttpOnly 禁止前端修改Cookie
                const random = Math.random()
                session[random] = {user_id: user.id}
                fs.writeFileSync('./session.json', JSON.stringify(session))
                response.setHeader("Set-Cookie", `session_id=${random}; HttpOnly`);
            }
            response.end()
        })
    } else if (path === '/signup' && method === 'POST') {
        response.setHeader('Content-Type', `text/html;charset=utf-8`);
        const userArray = JSON.parse(fs.readFileSync('./db/users.json'))
        const array = [];
        // 监听上传事件,push数据进数组
        request.on('data', (chunk) => {
            array.push(chunk)
        })
        // 结束后查看数组
        request.on('end', () => {
            //Buffer将数据合成为字符串的功能
            const string = Buffer.concat(array).toString()
            const obj = JSON.parse(string)
            const lastUser = userArray[userArray.length - 1]
            const newUser = {id: lastUser ? lastUser.id + 1 : 1, name: obj.name, password: obj.password}
            userArray.push(newUser)
            fs.writeFileSync('./db/users.json', JSON.stringify(userArray))
            response.end()
        })
    } else {
        response.statusCode = 200
        // 默认首页
        const filePath = path === '/' ? '/index.html' : path
        const startIndex = filePath.lastIndexOf('.')
        const suffix = filePath.substring(startIndex)
        // 声明哈希表
        const fileType = {
            '.html': 'text/html',
            '.css': 'text/css',
            '.js': 'text/javascript',
            '.png': 'image/png'
        }
        response.setHeader('Content-Type', `${fileType[suffix] || 'text/html'};charset=utf-8`)
        let content
        try {
            content = fs.readFileSync(`./public${filePath}`)
        } catch (error) {
            content = '文件不存在'
            response.statusCode = 404
        }
        response.write(content)
        response.end()
    }
    /******** 代码结束，下面不要看 ************/
})

server.listen(port)
console.log('监听 ' + port + ' 成功\n请用在空中转体720度然后用电饭煲打开 http://localhost:' + port)